//Linkwish's code
#include<bits/stdc++.h>
#include "graph.h"
#define endl '\n'
#define si inline
#define fi first
#define se second
using namespace std;
typedef long long ll;typedef __int128 li;typedef long double ld;
typedef pair<int,int> pii;typedef pair<ll,ll> pll;
typedef const int ci;typedef const ll cl;ci iinf=1e9;cl linf=LLONG_MAX;
template<typename T>si bool gmax(T &x,const T y){if(x<y)return x=y,1;return 0;}
template<typename T>si bool gmin(T &x,const T y){if(y<x)return x=y,1;return 0;}

ci N=205;

int d[N];
int e[N][N];
vector<pii> g[N];

int cnt;

void dfs(int x,int fa){
	d[x]=NumberOfRoads();
	int las=LastRoad();
	if(~las)e[x][las]=fa;
	for(int i=1;i<=d[x];i++){
		if(i!=las){
			Move(i,2);
			if(Color()==2){
				e[x][i]=-LastRoad();
				Move(-e[x][i],2);
			}
			else{
				e[x][i]=++cnt;
				g[x].emplace_back(cnt,i);
				dfs(cnt,x);
			}
		}
	}
	for(int i=1;i<=d[x];i++)if(e[x][i]==fa)return Move(i,2),void();
}

void gc(int x,int fa,ci id){
	for(int i=1;i<=d[x];i++){
		if(e[x][i]<0){
			Move(i,2);
			int k=LastRoad();
			if(Color()==3){
				e[x][i]=id;
				e[id][k]=x;
				Move(k,3);
				break;
			}
			Move(k,2);
		}
	}
	for(pii i:g[x]){
		Move(i.se,2);
		gc(i.fi,x,id);
	}
	for(int i=1;i<=d[x];i++)if(e[x][i]==fa)return Move(i,2),void();
}
void work(int x,int fa){
	bool flag=false;
	for(int i=1;i<=d[x];i++)if(e[x][i]<0)flag=true;
	if(flag){
		for(pii i:g[x]){
			Move(i.se,3);
			gc(i.fi,x,x);
		}
	}
	for(pii i:g[x]){
		Move(i.se,2);
		work(i.fi,x);
	}
	for(int i=1;i<=d[x];i++)if(e[x][i]==fa)return Move(i,2),void();
}

int f[N][N];
int ans[N];

void Inspect(int R){
	cnt=1,dfs(1,0);
	work(1,0);

	for(int i=1;i<=cnt;i++){
		cout<<d[i]<<endl;
		for(int j=1;j<=d[i];j++)cout<<e[i][j]<<' ';
		cout<<endl;
	}

	for(int i=1;i<=cnt;i++)
		for(int j=1;j<=cnt;j++)
			f[i][j]=(i!=j)*iinf;

	for(int i=1;i<=cnt;i++)
		for(int j=1;j<=d[i];j++)
			f[i][e[i][j]]=1;

	for(int k=1;k<=cnt;k++)
		for(int i=1;i<=cnt;i++)
			for(int j=1;j<=cnt;j++)
				gmin(f[i][j],f[i][k]+f[j][k]);
	
	for(int i=1;i<=cnt;i++)
		for(int j=i+1;j<=cnt;j++)
			if(f[i][j]<=cnt)ans[f[i][j]]++;

	for(int i=1;i<=R;i++)Answer(i,ans[i]);
}